package eu.jk.config;

import java.io.Reader;
import java.util.List;

import eu.jk.helper.ResourceUtil;

/**
 * 配置读取引擎
 * @author WZZ
 *
 */
public abstract class ConfigEngine {
	
	public static ConfigEngine getEngine(int engineType) {
		switch (engineType) {
		case EngineType.XMLEngine:
			return new XMLEngine();
		case EngineType.PlainTextEngine:
			return new PlainTextEngine();
		}
		return null;
	}
	
	/**
	 * Engine 类型
	 * @author WZZ
	 *
	 */
	public interface EngineType {
		
		int XMLEngine = 0;
		
		int PlainTextEngine = 1;
	}
	
	/**
	 * 执行初始化操作
	 * @param reader 配置文件reader
	 */
	public abstract void init(Reader reader) throws ConfigException;
	
	/**
	 * 执行初始化操作
	 * @param path 配置文件路径
	 * @param encoding 文件编码
	 */
	public abstract void init(String path, String encoding) throws ConfigException;
	
	/**
	 * 将当前路径基点定位到path
	 * @param path 路径
	 * @throws ConfigException 
	 */
	public abstract void locate(String path) throws ConfigException;

	/**
	 * 获取配置值， 如果不存在， 返回null
	 * @param path
	 * @return
	 */
	public abstract String getValue(String path) throws ConfigException;
	
	/**
	 * 查出满足路径的所有配置值, 如果没有找到，返回一个空列表
	 * @param path
	 * @return
	 * @throws ConfigException 
	 */
	public abstract List<String> getValues(String path) throws ConfigException;
	
	/**
	 * 获取该路径下的所有子元素的名字
	 * @param path
	 * @return
	 * @throws ConfigException
	 */
	public abstract List<String> getSubNames(String path) throws ConfigException;
	
	public static void main(String[] args) {
		ConfigEngine engine = ConfigEngine
				.getEngine(ConfigEngine.EngineType.XMLEngine);
		engine.init(ResourceUtil.getResourcePath("intergration.xml"), "UTF-8");
		engine.getValues("/net/modules");
		engine.locate("/net/modules");
		for(String str : engine.getValues("module/class"))
			System.out.println(str);
	}
}
